#include "bsp_gpio.h"

void led_init(void)
{
	/* 1、初始化IO复用 */
	IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);		/* 复用为GPIO1_IO0 */
	IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0X10B0);
	/* 3、初始化GPIO,设置GPIO1_IO03设置为输出  */
	//GPIO1->GDIR |= (1 << 3);  
	gpio_init(GPIO1,3,GPIO_OUTPUT);
}
void led_switch(uint8_t status)
{
	if(status == 1){
		GPIO1->DR &= ~(1<<3);//开启led 
	}
	else if(status == 0){
		GPIO1->DR |= (1<<3);//关闭led 
	}
}
void beep_init(void)
{
	/* 1、初始化IO复用 */
	IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0x00000000);		/* 复用为GPIO5_IO1 */
	IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0X000010B0);
	GPIO5->GDIR |= (1 << 1);  /* 初始化GPIO,设置GPIO5_IO1设置为输出  */
	GPIO1->DR |= (1<<1);//关闭蜂鸣器               
}

void beep_switch(uint8_t status)
{
	if(status == 1){
		GPIO1->DR &= ~(1<<1);//开启蜂鸣器
	}
	else if(status == 0){
		GPIO1->DR |= (1<<1);//关闭蜂鸣器
	}
}

void key_init(void)
{
	IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0x00000000);	/* 复用为GPIO1_IO18 */	
	IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0X0000F080);/* 设置电气属性 */
	/* 3、初始化GPIO,设置GPIO1_IO18设置为输入  */
	GPIO1->GDIR &= ~(1 << 18);                
}
int key_read(void)
{
	return (((GPIO1->DR) >> 18) & 0x1);
}

void gpio_init(GPIO_Type *BASE,unsigned int pin,unsigned int mode)
{
	BASE->IMR &= ~(1U << pin);//关闭外部中断
	if(mode == GPIO_INPUT)
	{
		BASE->GDIR &= ~(1 << pin);
	}
	if(mode == GPIO_OUTPUT)
	{
		BASE->GDIR |= (1 << pin); 
		gpio_write(BASE,pin,1);//默认输出高电平
	}

}
void gpio_write(GPIO_Type *BASE,unsigned int pin,unsigned char value)
{
	if(value == 0){
		BASE->DR &= ~(1<<pin);//reset
	}
	if(value == 1){
		BASE->DR |= (1<<pin);//set
	}
}

unsigned int gpio_read(GPIO_Type *BASE,unsigned int pin)
{
	return (((BASE->DR) >> pin) & 0x1);
}



/*
 * @description  			: 设置GPIO的中断配置功能
 * @param - base 			: 要配置的IO所在的GPIO组。
 * @param - pin  			: 要配置的GPIO脚号。
 * @param - pinInterruptMode: 中断模式，参考枚举类型gpio_interrupt_mode_t
 * @return		 			: 无
 */
void gpio_intconfig(GPIO_Type* base, unsigned int pin, gpio_interrupt_mode_t pin_int_mode)
{
	volatile uint32_t *icr;
	uint32_t icrShift;

	icrShift = pin;
	
	base->EDGE_SEL &= ~(1U << pin);

	if(pin < 16) 	/* 低16位 */
	{
		icr = &(base->ICR1);
	}
	else			/* 高16位 */
	{
		icr = &(base->ICR2);
		icrShift -= 16;
	}
	switch(pin_int_mode)
	{
		case(kGPIO_IntLowLevel):
			*icr &= ~(3U << (2 * icrShift));
			break;
		case(kGPIO_IntHighLevel):
			*icr = (*icr & (~(3U << (2 * icrShift)))) | (1U << (2 * icrShift));
			break;
		case(kGPIO_IntRisingEdge):
			*icr = (*icr & (~(3U << (2 * icrShift)))) | (2U << (2 * icrShift));
			break;
		case(kGPIO_IntFallingEdge):
			*icr |= (3U << (2 * icrShift));
			break;
		case(kGPIO_IntRisingOrFallingEdge):
			base->EDGE_SEL |= (1U << pin);
			break;
		default:
			break;
	}
}

/*
 * @description  			: 使能GPIO的中断功能
 * @param - base 			: 要使能的IO所在的GPIO组。
 * @param - pin  			: 要使能的GPIO在组内的编号。
 * @return		 			: 无
 */
void gpio_enableint(GPIO_Type* base, unsigned int pin)
{ 
    base->IMR |= (1 << pin);
}

/*
 * @description  			: 禁止GPIO的中断功能
 * @param - base 			: 要禁止的IO所在的GPIO组。
 * @param - pin  			: 要禁止的GPIO在组内的编号。
 * @return		 			: 无
 */
void gpio_disableint(GPIO_Type* base, unsigned int pin)
{ 
    base->IMR &= ~(1 << pin);
}

/*
 * @description  			: 清除中断标志位(写1清除)
 * @param - base 			: 要清除的IO所在的GPIO组。
 * @param - pin  			: 要清除的GPIO掩码。
 * @return		 			: 无
 */
void gpio_clearintflags(GPIO_Type* base, unsigned int pin)
{
    base->ISR |= (1 << pin);
}
